#pragma once

#include <string>
#include <vector>
#include <memory>
#include <unordered_map>
#include "nlohmann/json.hpp"
#include "strategy.h"
#include "market_data/market_data.h"
#include "trade_data.h"
#include "risk.h"
#include "monitor.h"

namespace hft {

// 回测结果
struct BacktestResult {
    double total_return;           // 总收益率
    double annual_return;          // 年化收益�?
    double sharpe_ratio;           // 夏普比率
    double max_drawdown;           // 最大回�?
    double win_rate;               // 胜率
    double profit_factor;          // 盈亏�?
    double avg_profit;             // 平均盈利
    double avg_loss;               // 平均亏损
    double max_consecutive_wins;   // 最大连续盈利次�?
    double max_consecutive_losses; // 最大连续亏损次�?
    std::vector<double> returns;   // 收益率序�?
    std::vector<double> drawdowns; // 回撤序列
    std::vector<Trade> trades;     // 交易记录
};

// 回测引擎
class BacktestEngine {
public:
    BacktestEngine();
    ~BacktestEngine();

    // 初始化回�?
    bool init(const nlohmann::json& config);

    // 加载历史数据
    bool loadData(const std::string& data_path);

    // 运行回测
    BacktestResult run();

    // 获取回测结果
    const BacktestResult& getResult() const { return result_; }

private:
    // 初始化策�?
    bool initStrategy();

    // 初始化风�?
    bool initRisk();

    // 初始化监�?
    bool initMonitor();

    // 处理行情数据
    void processMarketData(const MarketDataMessage& data);

    // 处理订单
    void processOrder(const Order& order);

    // 处理成交
    void processTrade(const Trade& trade);

    // 更新持仓
    void updatePosition(const Position& position);

    // 更新账户
    void updateAccount(const Account& account);

    // 计算回测指标
    void calculateMetrics();

    // 计算收益�?
    void calculateReturns();

    // 计算回撤
    void calculateDrawdowns();

    // 计算夏普比率
    double calculateSharpeRatio();

    // 计算胜率
    double calculateWinRate();

    // 计算盈亏�?
    double calculateProfitFactor();

    // 计算最大连续盈亏次�?
    void calculateConsecutiveWinsLosses();

    nlohmann::json config_;
    std::shared_ptr<Strategy> strategy_;
    std::vector<MarketDataMessage> market_data_;
    std::vector<Trade> trades_;
    std::unordered_map<std::string, Position> positions_;
    Account account_;
    BacktestResult result_;
    bool running_;
};

} // namespace hft 